<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="nW0KK" id="nW0KK"><span data-lake-id="u9f7b31a9" id="u9f7b31a9">典型回答</span></h1>
  <p data-lake-id="uac805612" id="uac805612"><br></p>
  <p data-lake-id="ue0c104cb" id="ue0c104cb"><strong><span data-lake-id="ufd4108f0" id="ufd4108f0">共享锁又称读锁，是读取操作创建的锁</span></strong><span data-lake-id="u91b3b69b" id="u91b3b69b">。其他用户可以并发读取数据，但任何事务都不能对数据进行修改（获取数据上的排他锁），直到已释放所有共享锁。</span></p>
  <p data-lake-id="uad257a1b" id="uad257a1b"><span data-lake-id="u0cd468b5" id="u0cd468b5">​</span><br></p>
  <p data-lake-id="u08ab9ff0" id="u08ab9ff0"><span data-lake-id="u3adeab43" id="u3adeab43">如果事务T对数据A加上共享锁后，则其他事务只能对A再加共享锁，不能加排他锁。</span><strong><span data-lake-id="ude742fc6" id="ude742fc6">获得共享锁的事务只能读数据，不能修改数据。</span></strong></p>
  <p data-lake-id="u9e8079bb" id="u9e8079bb"><span data-lake-id="u6d84d121" id="u6d84d121">​</span><br></p>
  <pre lang="java"><code>
SELECT ... LOCK IN SHARE MODE;
</code></pre>
  <p data-lake-id="u282916bd" id="u282916bd" style="text-align: justify"><span data-lake-id="uc9821abf" id="uc9821abf">​</span><br></p>
  <p data-lake-id="u36aa42c8" id="u36aa42c8" style="text-align: justify"><span data-lake-id="u639c7f7d" id="u639c7f7d">在查询语句后面增加LOCK IN SHARE MODE，MySQL会对查询结果中的每行都加共享锁，当没有其他线程对查询结果集中的任何一行使用排他锁时，可以成功申请共享锁，否则会被阻塞。其他线程也可以读取使用了共享锁的表，而且这些线程读取的是同一个版本的数据。</span></p>
  <p data-lake-id="u7378dd03" id="u7378dd03" style="text-align: justify"><span data-lake-id="u1c004fdc" id="u1c004fdc">​</span><br></p>
  <p data-lake-id="u2afc3194" id="u2afc3194" style="text-align: justify"><strong><span data-lake-id="u3e784edf" id="u3e784edf">排他锁又称写锁，</span></strong><span data-lake-id="u212413a6" id="u212413a6">如果事务T对数据A加上排他锁后，则其他事务不能再对A加任任何类型的锁。</span><strong><span data-lake-id="ub325bc3c" id="ub325bc3c">获得排他锁的事务既能读数据，又能修改数据。</span></strong></p>
  <p data-lake-id="u4139e676" id="u4139e676" style="text-align: justify"><span data-lake-id="ud171bf24" id="ud171bf24">​</span><br></p>
  <pre lang="java"><code>
SELECT ... FOR UPDATE;
</code></pre>
  <p data-lake-id="u6b942c82" id="u6b942c82" style="text-align: justify"><span data-lake-id="u1437b399" id="u1437b399">​</span><br></p>
  <p data-lake-id="u18fcb140" id="u18fcb140" style="text-align: justify"><span data-lake-id="ud606e445" id="ud606e445">在查询语句后面增加FOR UPDATE，MySQL会对查询命中的每条记录都加排他锁（在有索引的情况下其实是通过索引加锁，无索引时会锁表），当没有其他线程对查询结果集中的任何一行使用排他锁时，可以成功申请排他锁，否则会被阻塞。</span></p>
  <p data-lake-id="u394806f1" id="u394806f1" style="text-align: justify"><span data-lake-id="u6463c91b" id="u6463c91b">​</span><br></p>
  <p data-lake-id="ua3244a23" id="ua3244a23" style="text-align: justify"><span data-lake-id="uf341404a" id="uf341404a">​</span><br></p>
 </body>
</html>